package br.com.intelsys.basics.bfactory;

/**
 * Um sistema bem feito precisa ser coeso, modulado, abstrato o quanto possivel
 * e plugavel.
 * 
 * A coesao fica por sua parte mas com o BFactory eh possivel criar uma fabrica
 * de Beans. Isto significa que voce evitara de instanciar os objetos
 * manualmente e da esta tarefa para uma fabrica.
 * 
 * Assim voce ira trabalhar sempre com interfaces enquanto a fabrica ira criar
 * sempre as implementacoes destas interfaces.
 * 
 * Assim seu sistema nao precisa saber como ele eh implementado. E esta mesma
 * implementacao pode ser mudada livremente sem precisar alterar uma linha do
 * sistema.
 * 
 * @author Patrick Givisiez
 * 
 */
public interface BFactory {
	/**
	 * Verifica se existe um Bean na fabrica
	 * 
	 * @param name
	 *            Nome do bean
	 * @return true se o bean existe e esta disponivel
	 */
	public boolean containsBean(String name);

	/**
	 * Recupera os "apelidos" de um determinado bean
	 * 
	 * @param name
	 *            Nome do bean
	 * @return Lista de "apelidos"
	 */
	public String[] getAliases(String name);

	/**
	 * Recupera um Bean
	 * 
	 * @param name
	 *            Nome do Bean
	 * @return Bean. Necessita ser feito cast para usa-lo.
	 */
	public Object getBean(String name);

	/**
	 * Recupera um Bean
	 * 
	 * @param clazz
	 *            Classe do bean
	 * @return Bean. Necessita ser feito cast para usa-lo.
	 */
	public Object getBean(Class<?> clazz);

	/**
	 * Recupera um Bean de um tipo determinado
	 * 
	 * @param name
	 *            Nome do Bean
	 * @param requiredType
	 *            Tipo requerido
	 * @return Bean. Ncessita ser feito cast para usa-lo.
	 */
	public Object getBean(String name, Class<?> requiredType);

	/**
	 * Recupera qual eh o tipo de um determinado Bean
	 * 
	 * @param name
	 *            Nome do Bean.
	 * @return Tipo do bean
	 */
	public Class<?> getType(String name);

	/**
	 * Verifica se o Bean eh um Prototype.
	 * 
	 * @param name
	 *            Nome do Bean.
	 * @return true se eh um Prototype
	 */
	public boolean isPrototype(String name);

	/**
	 * Verifica se um Bean eh um Singleton.
	 * 
	 * @param name
	 *            Nome do Bean.
	 * @return true se eh um Singleton
	 */
	public boolean isSingleton(String name);

	/**
	 * Verifica se um determinado Bean eh compativel com algum tipo
	 * 
	 * @param name
	 *            Nome do Bean.
	 * @param targetType
	 *            Tipo que sera verificado.
	 * @return true se eh compativel.
	 */
	public boolean isTypeMatch(String name, Class<?> targetType);
}
